今日の目標
今日の夜もdiscuss開発を進めていきたい。昨日までで一応かんたんな投稿は出来ていたので、あとはpostやthreadなどに細かいパラメータを設定していくだけの作業となる。とりあえずthreadのユニークユーザー数の取得が出来ていなかったので、それをやっていく。
アルゴリズム
具体的なプログラムの順序としては、まず最初に思いついたのは一番単純明快な方法でpostにはユーザーIDのパラメータがあるので、対象のスレッドで投稿されているpostのユーザーIDを取得して、その回に投稿される投稿のユーザーIDと比べて重複がなければ(つまり、発言が初めてのときは)スレッドのユニークユーザー数をインクリメントする、というような形のプログラム。処理量はまず、膨大な投稿から対象のスレッドの投稿を集めて...というところが時間がかかりそうな気もするが...
ああ、それよりもDB検索をユーザーIDとスレッドIDでかけて出力がなければ初めての投稿ということができるのか。さて、早速コーディングに入ろうと思ったのだがもう少し早くなりそうなアルゴリズムはないのだろうか、と考えて僕の頭で絞り出せたのが、threadに利用ユーザーIDの配列をシリアライズして入れておいてそれを見て、追加するべきかを判断、ユニークユーザー数はその配列の要素数になる。というアイデアだった。とりあえずこれ以上考えていても仕方ないような感じがするのでコーディングしてみる。コーディング
コーディングは、まずシリアライズしたユーザーのデータを入れるためのコラムをdbに作る。名前は適当にusersとでもしておいて型はシリアルを入れるのでTEXT型にする(#1)、threadの保存処理にシリアライズ処理を書き加えて、postの保存処理では投稿時にスレッドの配列を重複をチェックして更新。かんたんなコードを書けばいいだけ。
#1 TEXT型はmysqlで自由な長さの文字列を入れられる型。シリアルはデータがどれだけ長くなるかもわからないし、制限する必要もないので、これを採用。
テスト
では、ブラウザを更新して実行してみる。以下、出力。OUTPUT >>>
* Threads
147 tkの初めてのスレッド 2017-06-08 06:19:40
148 tkの初めてのスレッド 2017-06-08 22:13:03
* Posts
132 tk's post. Initialize post. 2017-06-08 06:19:40
133 tk's post. Initialize post. 2017-06-08 22:13:03
まとめ
正直、今回やったことはまた次回やる、他のユーザーからの同じスレッドへの書き込みなどをやらないと、正常に動いているか確認できないので、次回はそれをやるかも git push.